function [x] = SMMmain(vec0)

load('SMM',...
    'p0_init','mu_c_init','sig_eps_a_init','rho_a_init',...
    'power_p0','power_mu_c','power_sig_eps_a','power_rho_a');

%close all %close figure windows
% p0_aux = abs(tanh(vec0(1)));
% p0_SMM = p0_init+(p0_aux^power_p0/p0_init^power_p0-1);
% mu_c_aux = vec0(2);
% mu_c_SMM = mu_c_init+(mu_c_aux^power_mu_c/mu_c_init^power_mu_c-1);
% 
% sig_eps_a_aux = exp( vec0(3));
% sig_eps_a_SMM = sig_eps_a_init+(sig_eps_a_aux^power_sig_eps_a/sig_eps_a_init^power_sig_eps_a-1);
% rho_a_aux = tanh(vec0(4));
% rho_a_SMM = rho_a_init+(rho_a_aux^power_rho_a/rho_a_init^power_rho_a-1);

p01_SMM = abs(tanh(vec0(1)));
p02_SMM = abs(tanh(vec0(2)));
p03_SMM = abs(tanh(vec0(3)));
p04_SMM = abs(tanh(vec0(4)));

mu_c1_SMM = vec0(5);
mu_c2_SMM = vec0(6);
mu_c3_SMM = vec0(7);
mu_c4_SMM = vec0(8);

%sig_c_SMM = vec0(2);
sig_eps_a1_SMM =exp( vec0(9));
sig_eps_a2_SMM =exp( vec0(10));
sig_eps_a3_SMM =exp( vec0(11));
sig_eps_a4_SMM =exp( vec0(12));


%--------------------------------------------------------------------
% Expanding the search area around 'phi' (transformation of phi_aux:)
%load('SMM','phi_init','power_phi');
%phi_aux = vec0(7);
%phi_SMM = phi_init+(phi_aux^power_phi/phi_init^power_phi-1);
%--------------------------------------------------------------------
% fprintf(' \n');
% fprintf(' \n');
% 
% disp('==========================================================')
% disp('SIMULATED METHOD OF MOMENTS: PARAMETER VALUES IN ALGORITHM')
% fprintf('p01           %4.6f (%4.6f) \n', p01_SMM, vec0(1));
% fprintf('p02           %4.6f (%4.6f) \n', p02_SMM, vec0(2));
% 
% fprintf('mu_c1         %4.6f (%4.6f)\n', mu_c1_SMM, vec0(3));
% fprintf('mu_c2         %4.6f (%4.6f)\n', mu_c2_SMM, vec0(4));
% 
% fprintf('sig_eps_a1   %4.6f (%4.6f)\n', sig_eps_a1_SMM, vec0(5));
% fprintf('sig_eps_a2   %4.6f (%4.6f)\n', sig_eps_a2_SMM, vec0(6));
% 
% fprintf('rho_a1_SMM   %4.6f (%4.6f)\n', rho_a1_SMM, vec0(7));
% fprintf('rho_a2_SMM   %4.6f (%4.6f)\n', rho_a2_SMM, vec0(8));
% 
% disp('==========================================================')

save('SMM','p01_SMM','p02_SMM','p03_SMM','p04_SMM','mu_c1_SMM','mu_c2_SMM','mu_c3_SMM','mu_c4_SMM','sig_eps_a1_SMM','sig_eps_a2_SMM','sig_eps_a3_SMM','sig_eps_a4_SMM','-append')
%'rkappa_d_SMM','alfa_SMM','eta_SMM','-append')
% ---------------------------------------------------------
% check for bounds
% if p0_SMM > 1; % UB rho
%     p0_SMM=0.8;
%     disp('Parameter value out of permissable bounds')
%     disp('1')
%     
% elseif p0_SMM < 0
%     p0_SMM=0.1;
%     disp('Parameter value out of permissable bounds')
%     disp('2')
%     
% elseif mu_c_SMM < 0
%     mu_c_SMM=0.05;
%     disp('Parameter value out of permissable bounds')
%     disp('3')
% elseif mu_c_SMM > 0.4
%     mu_c_SMM=0.35;
%     disp('Parameter value out of permissable bounds')
%     disp('4')
% % elseif sig_c_SMM > 0.2;
% %     sig_c_SMM=0.15  ; 
% %     disp('Parameter value out of permissable bounds')
% %     disp('5')
% % elseif sig_c_SMM < 0;
% %     sig_c_SMM=0.05;   
% %     disp('Parameter value out of permissable bounds')
% %     disp('6')
% elseif sig_eps_a_SMM < 0;
%     sig_eps_a_SMM=0.02;    
%     disp('Parameter value out of permissable bounds')
%     disp('7')
% elseif sig_eps_a_SMM > 1;
%    sig_eps_a_SMM=0.05  
%     disp('Parameter value out of permissable bounds')
%     disp('8')
% 
% end
    
%global par
disp('Initializing the system...')
%=====================================
% START OF COPY AND PASTE FROM 'MAIN' FILE:

main % set options such that it runs just like that!
%%=========================================================================
% End of copy-past of main file!

 % for sens_tours
%==========================================================================
%% 7. SMM Estimator
%cd output
%load('moments','meanb_mom','meang_mom','meanc_mom','autology','std_logy_mom',...
%    'meandeftfrequency','corrsovspready_mom','meankappa_mom','meany_mom')
%cd .. 
%load('SMM','target')
%load parameters

m_target = target;

m_model = [f1;...
    avfracup1;...
     med1;...
    interq1;...
       kur1 ;
       f2;...
    avfracup2;...
     med2;...
    interq2;...
       kur2;
       f3;...
    avfracup3;...
     med3;...
    interq3;...
       kur3;
       f4;...
    avfracup4;...
     med4;...
    interq4;...
       kur4];

m_scale=scale;
1./scale
G = m_target - m_model;
% Weighting matrix W
size_weights = max(size(target));
scale = (ones(size_weights,1).*[4;1;1;1;1;4;1;1;1;1;4;1;1;1;1;4;1;1;1;1])./m_scale; 
% take probability of default with 'double importance'
W = eye(size_weights).*(ones(size_weights,1)*scale');
clear scale size_weights

dist_sqrd = G.*G;
W_vector = [W(1,1);W(2,2);W(3,3);W(4,4);W(5,5);W(6,6);W(7,7);W(8,8);W(9,9);W(10,10);
W(11,11);W(12,12);W(13,13);W(14,14);W(15,15);W(16,16);W(17,17);W(18,18);W(19,19);W(20,20)];
dist_weighted = dist_sqrd.*W_vector;
% Calculate new SMM estimator:
W
x = G'*W*G;
save('SMM','x','dist_sqrd','W_vector','dist_weighted','-append')
% store convergence history
load('SMM','p01_SMM','p02_SMM','p03_SMM','p04_SMM','mu_c1_SMM','mu_c2_SMM','mu_c3_SMM','mu_c4_SMM','sig_eps_a1_SMM','sig_eps_a2_SMM','sig_eps_a3_SMM','sig_eps_a4_SMM')
load('SMM','conv_SMM','xopt_SMM','conv_opt','SMM_count','tol_SMM')
% Keep track of number of rounds in SMM algorithm
SMM_count = SMM_count+1;
% Save outcome of this iteration step:
% a) The used parameters in 'theta2'
add_conv_SMM = [x,p01_SMM,p02_SMM,p03_SMM,p04_SMM,mu_c1_SMM,mu_c2_SMM,mu_c3_SMM,mu_c4_SMM,sig_eps_a1_SMM,sig_eps_a2_SMM,sig_eps_a3_SMM,sig_eps_a4_SMM];
conv_SMM = [conv_SMM;add_conv_SMM];
% Update 'best set of parameters'
if x < xopt_SMM % a) improvement? b) converged problem?
    %VFI_conv_SMM
    disp('IMPROVEMENT FOUND -- UPDATING THE BEST VALUE!')
    xopt_SMM = x;
    conv_opt = [x,p01_SMM,p02_SMM,p03_SMM,p04_SMM,mu_c1_SMM,mu_c2_SMM,mu_c3_SMM,mu_c4_SMM,sig_eps_a1_SMM,sig_eps_a2_SMM,sig_eps_a3_SMM,sig_eps_a4_SMM,0,0,0,0,0,0,0;... %  parameters
                m_model(1),m_model(2),m_model(3),m_model(4),m_model(5),m_model(6),m_model(7),m_model(8),m_model(9),m_model(10),m_model(11),m_model(12),m_model(13),m_model(14),m_model(15),m_model(16),m_model(17),m_model(18),m_model(19),m_model(20);...   % model moments, targeted
                target(1),target(2),target(3),target(4),target(5),target(6),target(7),target(8),target(9),target(10), target(11),target(12),target(13),target(14),target(15),target(16),target(17),target(18),target(19),target(20)];   % model moments, targeted
    %save 'best outcome'
    
    
    %copyfile('numeric.mat','SMM\best','f');
    %copyfile('parameters.mat','SMM\best','f');
    %copyfile('policies.mat','SMM\best','f');
    %copyfile('VFI.mat','SMM\best','f');
    %copyfile('PE.mat','SMM\best','f');
    %copyfile('calibration.txt','SMM\best','f'); 
    %cd output
    %    copyfile('statistics.txt','..\SMM\best','f'); 
    %cd ..
end

%% 8. OUTPUT/PRINT
fprintf('     \n');
% disp('===================================================================================');
% fprintf('MODEL SOLUTION (No.)      (%4.0f)  \n', SMM_count);
% disp('Model moments           Sqrd dist.    Wght dist.    (target)    (weight)');
% fprintf('1       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)  \n',m_model(1), dist_sqrd(1), dist_weighted(1), m_target(1), W_vector(1));
% fprintf('2       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n',  m_model(2),dist_sqrd(2), dist_weighted(2),m_target(2), W_vector(2));
% fprintf('3       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n',  m_model(3),dist_sqrd(3), dist_weighted(3),m_target(3), W_vector(3));
% fprintf('4       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n', m_model(4),dist_sqrd(4), dist_weighted(4), m_target(4), W_vector(4));
% fprintf('5       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n',  m_model(5),dist_sqrd(5), dist_weighted(5),m_target(5), W_vector(5));
% fprintf('6       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n',  m_model(6),dist_sqrd(6), dist_weighted(6),m_target(6), W_vector(6));
% fprintf('7   %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n', m_model(7),dist_sqrd(7), dist_weighted(7), m_target(7), W_vector(7));
% fprintf('8       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n',  m_model(8),dist_sqrd(8), dist_weighted(8),m_target(8), W_vector(8));
% fprintf('9       %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n',  m_model(9),dist_sqrd(9), dist_weighted(9),m_target(9), W_vector(9));
% fprintf('10   %4.6f      %4.3f        %4.3f        (%4.4f)      (%4.3f)   \n', m_model(10),dist_sqrd(10), dist_weighted(10), m_target(10), W_vector(10));


disp('--------------------------------------------------------------------------------------------------------------------------------------------------');
disp('SIMULATED METHOD OF MOMENTS HISTORY:')
fprintf('       F(x)         p01      p02          mu_c1  mu_c2        sig_eps_a1     sig_eps_a2   rho_a1  rho_a2 \n');
disp(conv_SMM) 
disp('--------------------------------------------------------------------------------------------------------------------------------------------------');
disp('BEST SET OF PARAMETERS (RESULTS):')
fprintf('        F(x)         p0          mu_c        sig_c       sig_eps_a   rho_a   \n');
disp(conv_opt(1,:))
fprintf('              1            2            3            4             5              6        7             8            9         10  \n');
fprintf('           (target)     (target)     (target)    (target)      (target)       (target)     (target)     (target)   (target)  (target) \n');
disp(conv_opt(2:3,:))
disp('==================================================================================================================================');
% Save results
save('SMM','m_model','G','conv_SMM','xopt_SMM','conv_opt','SMM_count','-append')
% SMMprint
% copyfile('SMM.txt','SMM','f'); 
% copyfile('SMM.mat','SMM','f'); 
% dropbox:
%copyfile('SMM.txt','D:\Dropbox\DIW_sync\2.Dysfin\Matlab\remote-control\SMM','f');
%copyfile('SMM.mat','D:\Dropbox\DIW_sync\2.Dysfin\Matlab\remote-control\SMM','f');
% Check if tolerance for convergence reached!
% if x < tol_SMM
%     disp('*********************************')
%     disp('A SUITABLE CALIBRATION WAS FOUND!')
%     disp('*********************************')
%     return
% end

end